www.gusucode.com > XbPhp开发框架 v1.4.5PHP源码程序 > XbPhp开发框架 v1.4.5/xbphp/xbphp/XbPhp/route/Xbphp.php

    <?php
/**
 * 静态公共类
 * @author wave
 */
class Xbphp  {
	//初始化
	public static $init = array();
	/**
	 * 解析服務器URL伪静态
	 * @return String
	 * @author wave
	 */
	public static function getServerUrl() {
		header("X-Powered-By:XbPHP");
		if(!empty($_SERVER['ORIG_PATH_INFO'])) {
			$url = $_SERVER['ORIG_PATH_INFO'];
		//windows or linux  nginx apache属性
		}elseif(!empty($_SERVER['PATH_INFO'])) {
			$url = $_SERVER['PATH_INFO'];
		}elseif(!empty($_SERVER['REQUEST_URI'])) {
			$url = $_SERVER['REQUEST_URI'];
		}
		$url = self::strposPath($url,strtolower(ROOT_PATH));
		$params = !empty($url) ? explode('/',ltrim(strip_tags($url),'/')) : '';
		if(count($params) == 1) {
			$url_arr = parse_url($url);
			$params[0] = isset($url_arr['path']) ?  ltrim($url_arr['path'],'/') : '';
			$params[1] = isset($url_arr['query']) ?  $url_arr['query'] : '';
		}
		self::seachUnset(strtolower(basename(ROOT)),$params);

		if(!empty($params) && isset($params[count($params) - 1]) ) {
			$arr =array_filter(explode('/',$params[count($params) - 1]));
			if(count($arr) >=1  && strpos($params[count($params) - 1],'.') !== false) {
				$params = self::strposReplace($params,'.');
			}
			
			if(count($arr) >=1  && strpos($params[count($params) - 1],'?') !== false) {
				$params = self::strposReplace($params,'?');
			}
		}

		 //删除目录文件
		self::seachUnset(strtolower(APP_PATH),$params);
		$params = array_values(array_filter($params));
		return (is_array($params) && count($params) > 1)  ? $params : '';
	}


	/**
	 * 截取数组最后一个元素,并替换成空
	 * @param Array $params  要截取的数组
	 * @param int $str  要截取的字符穿
	 * @return Array
	 * @author wave
	 */
	public static function strposReplace($params,$str) {
		$str = substr($params[count($params) - 1],strpos($params[count($params) - 1],$str));
		$params[count($params)- 1] = str_replace($str,'',$params[count($params) - 1]);
		return $params;
	}

	/**
	 * 缓存初始化对象
	 * @param string $obj 类名
	 * @return object
	 * @author wave
	 */
	public static function run_cache($obj) {
		if(!in_array($obj,self::$init) && class_exists($obj)){
			self::$init[$obj] = new $obj();
		}
		return isset(self::$init[$obj]) ? self::$init[$obj] : '';
	}

	/**
	 * 获取URL目录
	 * @author wave
	 */
	public static function getUrlPath() {
		if(isset($_SERVER['REDIRECT_URL'])) {
			//这个是linux或windows自动获取目录
			$pathinfo = $_SERVER['REDIRECT_URL']; 
			$pathinfo = self::strposPath($pathinfo,strtolower(ROOT_PATH));
			$arr = array_values(array_filter(explode('/',strip_tags($pathinfo))));
			self::seachUnset(strtolower(ROOT_PATH),$arr);
			self::seachUnset(strtolower(basename(ROOT)),$arr);
		}else { //单独LINUX动态记录目录
			$_SERVER['PHP_SELF'] = str_replace(array('/index.php'), '', $_SERVER['PHP_SELF']);
			if(!empty($_SERVER['PHP_SELF'])) {
				$arr = array_values(array_filter(explode('/', $_SERVER['PHP_SELF'])));
				if(count($arr) >= 1) {
					self::seachUnset(strtolower(basename(ROOT)),$arr);
				}
			}else { //windows nginx 偽靜態
				$arr =  array_values(array_filter(explode('/',ltrim(strip_tags($_SERVER['REQUEST_URI']),'/'))));
				self::seachUnset(strtolower(basename(ROOT)),$arr);
			}
		}

		if(isset($arr['0']) && file_exists(ROOT.DS.$arr['0'].DS)) {
			define('APP_PATH',$arr['0']);
		}
	}

	/**
	 * 获取框架加载完成的消耗的内存
	 * @return int
	 * @author wave
	 */
	public static function endMemory() {
		return memory_get_usage(true);
	}

	/**
	 * 获取框架消耗的内存
	 * @return string
	 * @author wave
	 */
	public static function memory($end = ''){
		if(!empty($end)) {
			$size = $end - START_MEMORY;
			$unit = array('b','kb','mb','gb','tb','pb'); 
			return round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i]; 
		} 
		
	}
	/**
	 * 转跳的URL
	 * @param string $url 要访问的URL
	 * @param int $type 类型 1为动态URL访问,2为伪静态访问
	 * @param Array $option 数组参数,下标为2开始,如果下标数字下于2则会失效
	 */
	public static function toUrl($url = '',$type = 1,$option = array()) {
		if(empty($url)) {
			return '';
		}
		if(strpos($url, '&') !== false && $type != 1){
			$url = (substr($url, 0,1) === '?') ? substr($url, 1) : $url;
		}
		switch ($type) {
			case 1: //为动态访问
				if(strpos($url, '/') !== false) {
					$urlArr = array_values(array_filter(explode('/', $url)));
					$dataArr = array();
					foreach ($urlArr as $key => $value) {
						switch ($key) {
							case 0:
								$dataArr[M] = $value;
								break;
							case 1:
								$dataArr[A] = $value;
								break;
							default:
								$key = (!empty($option) && isset($option[$key])) ? $option[$key] : $key;
								$dataArr[$key] = $value;
								break;
						}
					}
					$url = '?'.http_build_query($dataArr);
				}
				break;
			case 2:
				if(strpos($url, '&') !== false){
					$urlArr = explode('&', $url);
					$str  = '';
					foreach($urlArr as $key => $value) {
						$valArr = explode('=', $value);
						$str .= (!empty($option) && isset($option[$key])) ? '/'.$option[$key].'/'.$valArr[1] : '/'.$valArr[1];
					}
					$url = $str;
				}
				break;
		}
		return $url;
	}

	/**
	 * 截取路径
	 * @param string $Path 路径
	 * @param string $stopsPath 要截取路径
	 * @return string
	 * @author wave
	 */
	private static function strposPath($path,$stopsPath) {
		$key  = strpos($path,$stopsPath);
		return ($key !==false) ? substr($path, $key+strlen($stopsPath)) : $path;
	}


	/**
	 * 查找目录文件名是否存在
	 * @param string $string  要查找的元素
	 * @param Array $arr 要查找的数组
	 * @param len $len 要移除的长度
	 * @author wave
	 */
	private static function seachUnset($string,&$arr,$len =1) {
		$key = array_search($string,$arr,true);
		if( isset($arr[$key]) && strtolower($arr[$key]) == $string) {
			array_splice($arr, $key,$len);
		}
	}
}